﻿/**
 * \file UniteCombattante.cs
 * \brief Classe UniteCombattante
 * \author ARTUR Vincent
 * \author LAPERDRIX Pierre
 * \version 1.0
 */

namespace Implem
{
    using Interfaces;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    /**
     * \class UniteCombattante
     * \brief Objet representant les unites combattantes
     */
    public class UniteCombattante : Unite,IUniteCombattante
    {
        /**
         * \fn public UniteCombattante(Joueur j, Position p)
         * \brief Constructeur d'UniteCombattante
         * \param j le joueur proprietaire de l'unite
         * \param p la position de l'unite
         */
        public UniteCombattante(Joueur j, Position p) : base(j,p) { }

        /**
         * \fn  public override void seDeplacer(Position p)
         * \brief Deplace l'unite a la position p
         * \param p la position
         */
        public override void seDeplacer(Position p)
        {
            this._used = true;

            if (this.MovRest > 0)
            {
                bool mouvement = true;

                if (Carte.Unites.ContainsKey(p) && ((List<Unite>)Carte.Unites[p]).Count > 0)
                {
                    //Verification pour savoir si l'unite presente sur la case est une unite alliee ou une unite ennemie
                    List<Unite>.Enumerator denum = ((List<Unite>)Carte.Unites[p]).GetEnumerator();
                    denum.MoveNext();
                    Unite u = (Unite)denum.Current;
                    if (u.JoueurProprietaire != Partie.joueurCourant)
                    {
                        mouvement = false;
                        this.combattre(p);
                        if (((List<Unite>)Carte.Unites[p]).Count == 0)
                        {
                            mouvement = true;
                        }
                    } 
                }

                if(mouvement)
                {
                    Carte.suppressionUnite(this);
                    Posit = p;
                    Carte.ajoutUnite(this);
                    this._movRest--;
                    if (Carte.Villes.ContainsKey(p))
                    {
                        Ville v = Carte.Villes[p];
                        if (v.JoueurProprietaire != this.JoueurProprietaire && v.PositCentrale.X == this.Posit.X && v.PositCentrale.Y == this.Posit.Y)
                        {
                            this.priseVille();
                        }
                    }
                }
            }
            
        }

        /**
         * \fn public virtual void combattre(Position pAttaque)
         * \brief Engage un combat entre deux unites
         * \param pAttaque la position de l'unite attaquee par l'unite courante
         */
        public virtual void combattre(Position pAttaque)
        {
            Combat.attaque(this.Posit, pAttaque);   
        }
    }
}
